<?php
/**
 * Controller_Article
*
* Класс Controller_Order отвечает за обработку заказов
*
*/
class Controller_Order extends Controller_Base {
	/**
	 * Выбор действия по URL
	 *
	 */
	public function action() {
	Service_Debug::setDebug();
		switch ($this->arrRequest[1]) {
			case '': case 'list':
				if(isset($_GET['page'])) $pageNumber = $_GET['page']; // Записываем номер страницы, которую нужно показать
				else $pageNumber = 1; // По умолчанию выводим первую страницу
				
				$objOrder = new Order();
				// Считаем количество страниц для текущей навигации и проверяем корректность данных из GET
				$essenceCount = $objOrder->count();
				$pagesNumber = ceil($essenceCount / $objOrder->essenceNumberOnPage); // Необходимое количество страниц для навигации
				// Если GET пуст или в нём указан правильный номер страницы
				if(!$_GET || ($pageNumber <= $pagesNumber && preg_match("/^[1-9]{1}[\d]*$/",$pageNumber))) $this->actionList($objOrder,$pagesNumber,$pageNumber);
				else $this->setError(404);
			  break;
			case 'add':
				$objSession = User_Session::instance(); 
				if ((!$objSession->isLoggedIn() || User_User::getUser()->getField('user_type') == 'customer') || User_User::getUser()->getField('user_type') == 'master' && SimpleAdministration::isAdmin()) $this->actionAdd();
				else $this->setError(404);
				break;
			case 'edit':
				if (!is_numeric($this->arrRequest[2])) $this->setError(404);
				else { 
					$objOrder= new Order($this->arrRequest[2]);
					if ($objOrder->id) {
						if(SimpleAdministration::isAuthorOrAdmin($objOrder->getField('ID_user'))) $this->actionEdit($objOrder);
						else $this->setError(403);
					}
					else $this->setError(404);
				}
				break;
			default:
				if (!is_numeric($this->arrRequest[1])) $this->setError(404);
				else {
						$objOrder = new Order($this->arrRequest[1]);
						if ($objOrder->id) $this->actionOne($objOrder);
						else $this->setError(404);
				}
				break;
		}
	}

	/**
	 * Выводит страницу конкретного заказа
	 *
	 */
	public function actionOne($objOrder) {
		Service_Debug::setDebug();
		$objUser = User_User::getUser();
		if (SimpleAdministration::isAuthorOrAdmin($objOrder->getField('ID_user'))) $this->editUrl = W_ABSPATH . 'orders/edit/' . $objOrder->id;
		$objOrederResponse = new OrderResponse();
		
		$this->showLeftColumn = true;
		$this->bodyAttrs = 'class="order-page"';
		$this->title = $objOrder->getField('order_name');

		if(SimpleAdministration::isAuthorOrAdmin($objOrder->getField('ID_user'))) { // Если заказ просматривает его автор или админ
			// Получаем полный список откликов по заказу
			$arrResponses = $objOrederResponse->find('all', array('select' => '`order_response`.`is_read`,`order_response`.`text`,`order_response`.`created_at`,`order_response`.`ID_user`,`user`.`first_name`,`user`.`last_name`', 'joins' => 'LEFT JOIN `user` USING(`ID_user`)', 'conditions' => "`order_response`.`ID_order`='" . $objOrder->id . "'"));
			if(sizeof($arrResponses) > 0) { // Если у заказа имеются непросмотренные отклики - считаем их число и на него уменьшаем счётчик пользователя по новым откликам к заказам
				$notReadResponses = 0;
				foreach($arrResponses as $arrResponse) { // Считаем сколько непрочитанных откликов
					if($arrResponse['is_read'] == 0) $notReadResponses += 1;
				}
				if($notReadResponses > 0) $objOrder->makeRead($notReadResponses);
			}
		}
		// Считаем, сколько отклиеов на заказ всего
		$responsesCount = $objOrederResponse->count("`order_response`.`ID_order`='" . $objOrder->id . "'");
		
		$objViewArticle = new View_Order();
		$this->showHeader();
		$objViewArticle->showOrderPage($objOrder,$responsesCount, &$arrResponses);
		$this->showFooter();
	}
	
	/**
	 * Выводит список существующих заказов
	 *
	 */
	public function actionList($objOrder,$pagesNumber,$pageNumber) {
		Service_Debug::setDebug();
		$tempArrOrders = $objOrder->find('all', array('select' => 'count(`order_response`.`ID_order_response`) as `order_responses`,`order`.`ID_order`, `order`.`order_name`,`order`.`description`,`order`.`created_at`,`city_url`.`city_name`', 'joins' => 'INNER JOIN  `city_url` USING(`city`) LEFT JOIN `order_response` USING (`ID_order`)', 'group' => 'ID_order', 'order' => 'created_at DESC', 'limit' => $pageNumber * $objOrder->essenceNumberOnPage));

		// Номер первого отображаемого на текущей странице заказа
		$firstOrder = ($pageNumber - 1) * $objOrder->essenceNumberOnPage;
		// Номер последнего отображаемого на текущей странице заказа
		$lastOrder = $firstOrder + $objOrder->essenceNumberOnPage;
		for ($k=$firstOrder;$k<$lastOrder;$k++) {
			if (isset($tempArrOrders[$k])) $arrOrders[] = $tempArrOrders[$k];
		}
		
		$this->showLeftColumn = true;
		$this->title = $this->pageHead = 'Последние заказы';
		if (!(User_User::getUser()->getField('user_type') == 'master') || User_User::getUser()->getField('user_type') == 'master' && SimpleAdministration::isAdmin())  $this->addUrl = W_ABSPATH . 'orders/add';
		
		$objViewOrder = new View_Order();
		$this->showHeader();
		$objViewOrder->showAdminList(&$arrOrders,$pagesNumber,$pageNumber);
		$this->showFooter();
	}

	/**
	 * Страница добавления заказов
	 */
	public function actionAdd() {
		Service_Debug::setDebug();
	    if (isset($_POST['Order'])) {
			$objOrder = new Order($_POST['Order']);
			if ($objOrder->save()) User_Session::moveTo(W_ABSPATH . 'orders/' . $objOrder->id , 'Заказ успешно добавлен', 1);
		}
		else $objOrder = new Order();
		$this->showLeftColumn = false;
	  	$this->pageHead = 'Добавление заказа';
	  	$objViewOrder = new View_Order();

	  	$this->showHeader();
	    $objViewOrder->showAddForm($objOrder);
		$this->showFooter();
	}

	/**
	 * Выводит страницу редактирования статьи
	 *
	 * @param Order $objOrder - объект заказа для редактирования
	 */
	public function actionEdit($objOrder) {
		$editId = $objOrder->id;
		if (isset($_POST['Order'])) {
			$objOrder = new Order($_POST['Order']);
			if ($objOrder->id != $editId) User_Session::moveTo(View_Base::getLanguageUrl(W_ABSPATH) . 'orders/', Service_Translate::getText('Недопустимое действие'));
			if ($objOrder->save()) User_Session::moveTo(W_ABSPATH . 'orders/'. $objOrder->id , 'Заказ успешно сохранен', 1);
		}
		 
		$objViewOrder = new View_Order();
		$this->showLeftColumn = true;
		$this->pageHead = $this->title = 'Редактирование заказа "' . $objOrder->getField('order_name') . '"';
		$this->addWysiwygMetas();
		$this->showHeader();
		$objViewOrder->showEditForm($objOrder);
		$this->showFooter();
	}
}
?>